﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using LCTMoodle.Service;
using LCTMoodle.Models.ViewModels;
using LCTMoodle.Models.DataModels;
using LCTMoodle.Helper;

namespace LCTMoodle.Controllers
{
    public class KhoaHoc_ThanhVienController : Controller
    {
        /// <summary>
        /// Cập nhật thời điểm vào nhóm
        /// </summary>
        /// <param name="maKhoaHoc">Mã khóa học</param>
        /// <param name="tenNhom">Tên nhóm bài viết</param>
        public void CapNhatThoiDiem(int maKhoaHoc, string tenNhom)
        {
            if (TienIch.daDangNhap())
            {
                KhoaHoc_ThanhVienService.capNhatThoiDiemVaoKhoaHocTheoMaKhoaHocVaMaThanhVienVaTenNhom(maKhoaHoc, (Session["NguoiDung"] as NguoiDungViewModel).ma, tenNhom);
            }
        }

        #region Xử lý thành viên
        /// <summary>
        /// Xử lý đăng ký khóa học
        /// </summary>
        /// <param name="ma">Mã khóa học</param>
        public ContentResult XuLyDangKyKhoaHoc(int ma)
        {
            #region Kiểm tra quyền
            if (!TienIch.daDangNhap())
            {
                return Content("Chưa đăng nhập (Xử lý đăng ký khóa học)");
            }

            //Kiểm tra nếu người dùng đã là thành viên
            KhoaHoc_ThanhVienViewModel khoaHoc_ThanhVien = KhoaHoc_ThanhVienService.layKhoaHocThanhVienTheoMaKhoaHocVaMaThanhVien(ma, (Session["NguoiDung"] as NguoiDungViewModel).ma);
            //Tồn tại dòng 
            //=> Đã là thành viên hoặc bị chặn hoặc đang ở trạng thái xin
            if (khoaHoc_ThanhVien != null)
            {
                if (khoaHoc_ThanhVien.thoiDiemThamGia == DateTime.MinValue)
                {
                    //Bị chặn
                    return Content("Đã bị chặn (Xử lý đăng ký khóa học)");
                }

                if (khoaHoc_ThanhVien.maThanhVienMoi == 0)
                {
                    //Đang xin tham gia
                    return Content("Đã đăng ký (Xử lý đăng ký khóa học)");
                }

                //Đã là thành viên
                return Content("Đã là thành viên của nhóm (Xử lý đăng ký khóa học)");
            }
            #endregion Kiểm tra quyền
                        
            if (KhoaHoc_ThanhVienService.themKhoaHocThanhVien_DangKy(ma, (Session["NguoiDung"] as NguoiDungViewModel).ma))
            {
                return Content("OK");
            }

            return Content("Đăng ký vào nhóm thất bại");
        }

        /// <summary>
        /// Xử lý hủy đăng ký
        /// </summary>
        /// <param name="ma">Mã khóa học</param>
        public ContentResult XuLyHuyDangKyKhoaHoc(int ma)
        {
            #region Kiểm tra quyền
            if (!TienIch.daDangNhap())
            {
                return Content("Chưa đăng nhập (Xử lý hủy khóa học)");
            }

            //Kiểm tra người dùng đã là thành viên? Và có phải người dùng đang đăng ký nhóm không
            KhoaHoc_ThanhVienViewModel khoaHoc_ThanhVien = KhoaHoc_ThanhVienService.layKhoaHocThanhVienTheoMaKhoaHocVaMaThanhVien(ma, (Session["NguoiDung"] as NguoiDungViewModel).ma);

            //Không tồn tại dòng
            //=> Chưa đăng ký
            if (khoaHoc_ThanhVien == null)
            {
                return Content("Chưa đăng ký vào nhóm (Xử lý hủy khóa học)");
            }

            //Kiểm tra xem có đang là thành viên của nhóm không
            if (khoaHoc_ThanhVien.maThanhVienMoi != 0)
            {
                if (khoaHoc_ThanhVien.thoiDiemThamGia == DateTime.MinValue)
                {
                    //Bị chặn
                    return Content("Đã bị chặn (Xử lý hủy khóa học)");
                }
                //Đang là thành viên
                return Content("Đang là thành viên của nhóm (Xử lý hủy khóa học)");
            }
            #endregion Kiểm tra quyền

            //OK => Xóa
            if (KhoaHoc_ThanhVienService.xoaKhoaHocThanhVienTheoMaKhoaHocVaMaThanhVien(ma, (Session["NguoiDung"] as NguoiDungViewModel).ma))
            {
                return Content("OK");
            }

            return Content("Hủy đăng ký vào nhóm thất bại");
        }

        /// <summary>
        /// Trang xác nhận người dùng đăng ký vào khóa học
        /// </summary>
        /// <param name="ma">Mã khóa học</param>
        public ActionResult XacNhanDangKy(int ma)
        {
            #region Kiểm tra quyền
            if (!TienIch.daDangNhap())
            {
                TempData["ThongBao"] = new string[]
                    {
                        "Chưa đăng nhập (Xác nhận đăng ký nhóm)"
                    };
                return RedirectToAction("Index", "TrangChu");
            }

            switch (TienIch.kiemTraQuyenTrongKhoaHoc(ma, "10"))
            {
                case 0:
                    break;
                case 1:
                    TempData["ThongBao"] = new string[]
                    {
                        "Lấy quyền thất bại (Xác nhận đăng ký nhóm)"
                    };
                    return RedirectToAction("Index", "TrangChu");
                case 2:
                    TempData["ThongBao"] = new string[]
                    {
                        "Không có quyền xác nhận đăng ký nhóm"
                    };
                    return RedirectToAction("Index", "TrangChu");
                default:
                    break;
            }
            #endregion Kiểm tra quyền

            //Lấy dữ liệu khóa học
            KhoaHocViewModel khoaHoc = KhoaHocService.layKhoaHocTheoMaKhoaHoc(ma);
            if (khoaHoc == null)
            {
                TempData["ThongBao"] = new string[]
                    {
                        "Lấy khóa học thất bại (Xác nhận đăng ký nhóm)"
                    };
                return RedirectToAction("Index", "TrangChu");
            }

            //Lấy danh sách người dùng đăng ký
            List<KhoaHoc_ThanhVienViewModel> khoaHoc_ThanhVien = KhoaHoc_ThanhVienService.layNguoiDungDangKyKhoaHocTheoMaKhoaHoc(ma);
            if (khoaHoc_ThanhVien == null)
            {
                TempData["ThongBao"] = new string[]
                    {
                        "Lấy danh sách người dùng đăng ký thất bại (Xác nhận đăng ký nhóm)"
                    };
                return RedirectToAction("Index", "TrangChu");
            }

            Tuple<KhoaHocViewModel, List<KhoaHoc_ThanhVienViewModel>> model = new Tuple<KhoaHocViewModel, List<KhoaHoc_ThanhVienViewModel>>
                (
                    khoaHoc,
                    khoaHoc_ThanhVien
                );
            
            return View(model);
        }

        /// <summary>
        /// Chấp nhận đăng ký
        /// </summary>
        /// <param name="maKhoaHoc">Mã khoa học</param>
        /// <param name="maThanhVien">Mã thành viên</param>
        public ContentResult XuLyChapNhanDangKy(int maKhoaHoc, int maThanhVien)
        {
            #region Kiểm tra quyền
            if (!TienIch.daDangNhap())
            {
                return Content("Chưa đăng nhập (Xử lý chấp nhận đăng ký)");
            }
            switch (TienIch.kiemTraQuyenTrongKhoaHoc(maKhoaHoc, "10"))
            {
                case 0:
                    break;
                case 1:
                    return Content("Lấy quyền thất bại (Xử lý chấp nhận đăng ký)");
                case 2:
                    return Content("Không có quyền chấp nhận đăng ký");
                default:
                    break;
            }
            #endregion Kiểm tra quyền

            if (!KhoaHoc_ThanhVienService.capNhatKhoaHocThanhVienTheoMaKhoaHocVaMaThanhVienVaMaThanhVienMoi_ChapNhanDangKy(maKhoaHoc, maThanhVien, (Session["NguoiDung"] as NguoiDungViewModel).ma))
            {
                return Content("Chấp nhận thành viên thất bại");
            }
            return Content("OK");
        }

        /// <summary>
        /// Xóa khóa học - thành viên
        /// </summary>
        /// <param name="maKhoaHoc">Mã khóa học</param>
        /// <param name="maThanhVien">Mã thành viên</param>
        public ContentResult XuLyXoaKhoaHocThanhVien(int maKhoaHoc, int maThanhVien)
        {
            #region Kiểm tra quyền
            if (!TienIch.daDangNhap())
            {
                return Content("Chưa đăng nhập (Xóa khóa học - thành viên)");
            }
            switch (TienIch.kiemTraQuyenTrongKhoaHoc(maKhoaHoc, "10"))
            {
                case 0:
                    break;
                case 1:
                    return Content("Lấy quyền thất bại (Xóa khóa học - thành viên)");
                case 2:
                    return Content("Không có quyền xóa khóa học - thành viên");
                default:
                    break;
            }
            #endregion Kiểm tra quyền

            if (!KhoaHoc_ThanhVienService.xoaKhoaHocThanhVienTheoMaKhoaHocVaMaThanhVien(maKhoaHoc, maThanhVien))
            {
                return Content("Xóa khóa học - thành viên thất bại");
            }

            return Content("OK");
        }

        /// <summary>
        /// Xử lý chặn khóa học - thành viên
        /// </summary>
        /// <param name="maKhoaHoc">Mã khóa học</param>
        /// <param name="maThanhVien">Mã thành viên</param>
        public ContentResult XuLyChanKhoaHocThanhVien(int maKhoaHoc, int maThanhVien)
        {
            #region Kiểm tra quyền
            if (!TienIch.daDangNhap())
            {
                return Content("Chưa đăng nhập (Chặn khóa học - thành viên)");
            }
            switch (TienIch.kiemTraQuyenTrongKhoaHoc(maKhoaHoc, "10"))
            {
                case 0:
                    break;
                case 1:
                    return Content("Lấy quyền thất bại (Chặn khóa học - thành viên)");
                case 2:
                    return Content("Không có quyền chặn khóa học - thành viên");
                default:
                    break;
            }
            #endregion Kiểm tra quyền

            if (!KhoaHoc_ThanhVienService.capNhatKhoaHocThanhVienTheoMaKhoaHocVaMaThanhVienVaMaThanhVienMoi_ChanDangKy(maKhoaHoc, maThanhVien, (Session["NguoiDung"] as NguoiDungViewModel).ma))
            {
                return Content("Chặn khóa học - thành viên dùng thất bại");
            }

            return Content("OK");
        }

        /// <summary>
        /// Rời khỏi khóa học
        /// </summary>
        /// <param name="ma">Mã khóa học</param>
        public ActionResult RoiKhoaHoc(int ma)
        {
            #region Kiểm tra quyền
            if (!TienIch.daDangNhap())
            {
                TempData["ThongBao"] = new string[]
                {
                    "Chưa đăng nhập"
                };
                return RedirectToAction("Index", "TrangChu");
            }
            KhoaHoc_ThanhVienViewModel khoaHoc_ThanhVien = KhoaHoc_ThanhVienService.layKhoaHocThanhVienTheoMaKhoaHocVaMaThanhVien(ma, (Session["NguoiDung"] as NguoiDungViewModel).ma);
            if (khoaHoc_ThanhVien == null)
            {
                TempData["ThongBao"] = new string[]
                {
                    "Lấy khóa học - thành viên thất bại"
                };
                return RedirectToAction("Index", "TrangChu");
            }
            //Đang đăng ký hoặc bị chặn
            if (khoaHoc_ThanhVien.maThanhVienMoi == 0 || khoaHoc_ThanhVien.thoiDiemThamGia == DateTime.MinValue)
            {
                TempData["ThongBao"] = new string[]
                {
                    "Không có quyền rời khỏi khóa học"
                };
                return RedirectToAction("Index", "TrangChu");
            }
            #endregion Kiểm tra quyền

            if (KhoaHoc_ThanhVienService.xoaKhoaHocThanhVienTheoMaKhoaHocVaMaThanhVien(ma, (Session["NguoiDung"] as NguoiDungViewModel).ma))
            {
                TempData["ThongBao"] = new string[]
                {
                     "Rời khóa học thành công",
                     "Tot"
                };
                return RedirectToAction("Index", "TrangChu");
            }
            else
            {
                TempData["ThongBao"] = new string[]
                {
                    "Rời khóa học thất bại"
                };
                return Redirect(Request.UrlReferrer.ToString());
            }
        }

        /// <summary>
        /// Hiển thị danh sách thành viên của khóa học
        /// </summary>
        /// <param name="ma"></param>
        public ActionResult DanhSachThanhVien(int ma)
        {
            #region Kiểm tra quyền
            switch (TienIch.kiemTraQuyenTrongKhoaHoc(ma, "1"))
            {
                case 0:
                    break;
                case 1:
                    TempData["ThongBao"] = new string[]
                    {
                        "Lấy quyền thất bại (Danh sách thành viên)"
                    };
                    return RedirectToAction("Index", "TrangChu");
                case 2:
                    TempData["ThongBao"] = new string[]
                    {
                        "Không có quyền xem danh sách thành viên"
                    };
                    return RedirectToAction("Index", "TrangChu");
                default:
                    break;
            }
            #endregion Kiểm tra quyền
            
            Tuple<KhoaHocViewModel, List<KhoaHoc_ThanhVienViewModel>> model = new Tuple<KhoaHocViewModel, List<KhoaHoc_ThanhVienViewModel>>
                (
                    KhoaHocService.layKhoaHocTheoMaKhoaHoc(ma),
                    KhoaHoc_ThanhVienService.layKhoaHocThanhVienTheoMaKhoaHoc(ma)
                );

            if (model.Item1 == null)
            {
                TempData["ThongBao"] = new string[]
                    {
                        "Lấy khóa học thất bại (Danh sách thành viên)"
                    };
                return RedirectToAction("Index", "TrangChu");
            }

            if (model.Item2 == null)
            {
                TempData["ThongBao"] = new string[]
                    {
                        "Lấy khóa học - thành viên thất bại (Danh sách thành viên)"
                    };
                return RedirectToAction("Index", "TrangChu");
            }

            return View(model);
        }
        #endregion Xử lý thành viên
    }
}
